﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace OWLServerQL.dominio
{
    /// <summary>
    /// Consulta del generada
    /// </summary>
    public class Consulta
    {
        // Constantes
        private const string SALTO_LINEA = "\n";
        private const string ERRORES_SEMANTICOS = "\nErrores Semanticos: \n";
        private const string ERRORES_LEXICO = "\nErrores de Lexico: \n";
        private const string ERRORES = "\nOtros Errores: \n";

        private Elemento cuerpo;
        private string ontologia;
        private IList<ErrorOwlServerLQ> erroresLexico;
        private IList<ErrorOwlServerLQ> erroresSemanticos;
        private IList<ErrorOwlServerLQ> errores;

        /// <summary>
        /// Cuerpo de la consulta
        /// </summary>
        public Elemento Cuerpo
        {
            get { return cuerpo; }
            set { cuerpo = value; }
        }

        /// <summary>
        /// Ontología a la que hace referencia la consulta la consulta
        /// </summary>
        public string Ontologia
        {
            get { return ontologia; }
            set { ontologia = value; }
        }

        /// <summary>
        /// Errores semanticos que contenia la consulta.
        /// </summary>
        public IList<ErrorOwlServerLQ> ErroresSemanticos
        {
            get { return erroresSemanticos; }
            set { erroresSemanticos = value; }
        }

        /// <summary>
        /// Errores lexicos que contenia la consulta.
        /// </summary>
        public IList<ErrorOwlServerLQ> ErroresLexico
        {
            get { return erroresLexico; }
            set { erroresLexico = value; }
        }

        /// <summary>
        /// Errores que contenia la consulta.
        /// </summary>
        public IList<ErrorOwlServerLQ> Errores
        {
            get { return errores; }
            set { errores = value; }
        }

        public Consulta(Elemento cuerpo, string ontologia)
        {
            this.cuerpo = cuerpo;
            this.ontologia = ontologia;
        }

        /// <summary>
        /// Añade un error a la lista de errores
        /// </summary>
        /// <param name="mensaje">Mensaje el error</param>
        public void addError(string mensaje)
        {
            if (Errores == null)
            {
                Errores = new List<ErrorOwlServerLQ>();
            }
            Errores.Add(new ErrorOwlServerLQ(mensaje));
        }

        override public String ToString()
        {
            StringBuilder bf = new StringBuilder(cuerpo.ToString());
            bf.Append("\n\nOntología: ");
            bf.Append(ontologia);
            bf.Append(construirSalidaErrores());

            return bf.ToString();
        }

        /// <summary>
        /// Construye la salida de errores
        /// </summary>
        /// <returns></returns>
        private StringBuilder construirSalidaErrores()
        {
            StringBuilder salida = new StringBuilder();

            if (erroresSemanticos.Count > 0)
            {
                salida.Append(ERRORES_SEMANTICOS);
                foreach (ErrorOwlServerLQ er in erroresSemanticos)
                {
                    salida.Append(er.ToString());
                    salida.Append(SALTO_LINEA);
                }
            }

            if (erroresLexico.Count > 0)
            {
                salida.Append(ERRORES_LEXICO);
                foreach (ErrorOwlServerLQ er in erroresLexico)
                {
                    salida.Append(er.ToString());
                    salida.Append(SALTO_LINEA);
                }
            }

            if (errores.Count > 0)
            {
                salida.Append(ERRORES);
                foreach (ErrorOwlServerLQ er in errores)
                {
                    salida.Append(er.ToString());
                    salida.Append(SALTO_LINEA);
                }
            }

            return salida;
        }
    }
}
